package com.lanyou.esb.cook.proxy.redis.proxy;

import java.io.IOException;
import java.util.List;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.exceptions.JedisException;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.lanyou.esb.cook.proxy.exception.ParamSetRuntimeException;

/**
 * 针对List数据类型的Redis代理接口
 * 
 * @author Davey.wu
 */
public interface ListJedisProxy<T> extends JedisProxy<T> {

	/**
	 * 将集合元素插入链表右侧
	 * 
	 * @param values
	 *            ：值集合
	 * @throws JsonProcessingException
	 * @throws ParamSetRuntimeException
	 */
	void rpush(List<T> values) throws JedisException, JsonProcessingException;

	/**
	 * 将元素插入链表左侧
	 * 
	 * @param key
	 *            ：键
	 * @param value
	 *            ：值
	 * @throws JsonProcessingException
	 * @throws ParamSetRuntimeException
	 */
	void lpush(String key, T value) throws JedisException,
			JsonProcessingException;

	/**
	 * 将元素插入链表左侧
	 * 
	 * @param key
	 *            ：键
	 * @param value
	 *            ：值
	 * @throws JsonProcessingException
	 */
	void lpush(Jedis jedis, String key, T value) throws JedisException,
			JsonProcessingException;

	/**
	 * 将元素插入链表右侧
	 * 
	 * @param key
	 *            :键值
	 * @param target
	 *            ：目标对象
	 * @throws JsonProcessingException
	 */
	void rpush(String key, T target) throws JedisException,
			JsonProcessingException;

	/**
	 * 从链表左侧取出一个元素
	 * 
	 * @param key
	 *            ：键
	 * @return
	 * @throws JsonParseException
	 * @throws JsonMappingException
	 * @throws IOException
	 */
	T lpop(String key) throws JedisException, JsonParseException,
			JsonMappingException, IOException;

	/**
	 * 从链表左侧取出一个元素
	 * 
	 * @param jedis
	 *            ：jedis客户端对象
	 * @param key
	 *            ：键
	 * @return
	 * @throws IOException
	 * @throws JsonMappingException
	 * @throws JsonParseException
	 */
	T lpop(Jedis jedis, String key) throws JedisException, JsonParseException,
			JsonMappingException, IOException;

	/**
	 * 从链表左侧取出m个元素
	 * 
	 * @param key
	 *            ：键
	 * @param m
	 *            ：个数
	 * @return
	 * @throws JedisException
	 * @throws JsonParseException
	 * @throws JsonMappingException
	 * @throws IOException
	 */
	List<T> lpop(String key, int m) throws JedisException, JsonParseException,
			JsonMappingException, IOException;

	/**
	 * 从链表右侧取出一个元素
	 * 
	 * @param key
	 *            ：键
	 * @return
	 * @throws JsonParseException
	 * @throws JsonMappingException
	 * @throws IOException
	 */
	T rpop(String key) throws JedisException, JsonParseException,
			JsonMappingException, IOException;

	/**
	 * 从链表右侧取出一个元素
	 * 
	 * @param jedis
	 *            ：jedis客户端
	 * @param key
	 *            ：键
	 * @return
	 * @throws IOException
	 * @throws JsonMappingException
	 * @throws JsonParseException
	 */
	T rpop(Jedis jedis, String key) throws JedisException, JsonParseException,
			JsonMappingException, IOException;

}
